home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / internet / irc_i_dodatki / dwarfx / dwarf24.lha / dwarfx.amirx < prev    next >
Text File  |  1980-12-25  |  26KB  |  41 lines

  1. /* DWaRFx.AmIRX 1.25
  2. \\ $VER: DWaRFx 2.3 (15.5.97) By Gareth Murfin and David Newton!
  3. // This is the main control arexx script for DWaRFx to use with AmIRC.
  4. \\
  5. // Usage: DWaRFx.AmIRX [host]
  6. \\        Or run from within AmIRC (it should be called by Connected.AmIRX).
  7. //        Or double click on the DWaRFx.Exe file icon.
  8. \\
  9. //
  10. \\ See the DOCS for more info.
  11. */
  12.  
  13. /* Compressed with CompressRexx v2.1, (C) 1993-96 Robert Hofmann */
  14. Parse Arg args .;Options Results;Call Setclip('DFxTIME',Time());If Pos("AMIRC.",Upper(args))=0 Then envadr=Address();Else envadr=Upper(Strip(args));Call SETUP;If Left(envadr,hostlen)~=host Then Call FIND_PORT;If envadr="" Then Exit;envnum=Substr(envadr,hostlen+1);If Getclip('DFx.'envnum)="Y" Then Call ERR(1);Call Setclip('DFx.'envnum,"Y");Address Value(envadr);If ~Show(L,'rexxsupport.library') Then Do;If ~Addlib('rexxsupport.library',0,-30,0) Then Do;"Echo "dfxname||d2c(2)"Error:"d2c(2)" Unable to open rexxsupport.library!";Exit;End;End;Signal On SYNTAX;Call CONFIG_SETUP();'IsConnected';Do While RC~=0 & Show('P',envadr);Call Delay(50);'IsConnected';End;If ~Show('P',envadr) Then Call REMOVE;Call Delay(60);'Echo 'dfxname' 'dwarfx' Is now running!';'GetMyNick';znick=result;mnick=Upper(znick);Call NICKLIST;Do Forever;'GetLine';If line="" Then Call REMOVE;com=Find(coms,line.command);If com=0 Then Iterate;npos=pos("!",line.prefix)-1;If npos>0 Then nnick=Substr(line.prefix,1,npos)
  15. zchannel=line.dest;unick=Upper(nnick);If com>4 Then routine='COMMAND'||com;Else Do;type=Pos(Substr(line.rest,2,1),scan);routine='ROUTINE'||type;End;Interpret 'Call' routine;End;Exit;ROUTINE0:;uchannel=Upper(zchannel);tmp=Find(c_wordchan,uchannel);If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick line.rest;If c_wordkick=0 | (tmp=0 & c_wordkick=2) | (tmp~=0 & c_wordkick=3) Then Return;nkick=0;mess=Upper(line.rest);tmp=Words(c_words);Do wloop=1 To tmp;nkick=Pos(Word(c_words,wloop),mess);If nkick>0 Then Leave;End;ctmp=Find(uchans,uchannel);If nkick=0 | Left(ochan.ctmp,1)='0' Then Return;tmp1=Find(lchan.ctmp,unick);If tmp1=0 Then Return;tmp=Substr(wchan.ctmp,tmp1,1);If tmp<c_wordwarn Then Do;tmp=tmp+1;wchan.ctmp=Overlay(tmp,wchan.ctmp,tmp1);If tmp=c_wordwarn then tmp=tmp' 'bold2'|FINAL WARNING|'bold2;'SAY /Notice 'zchannel' 'dwarfx' Swear word warning #'tmp' - 'nnick;If c_deop=1 & Substr(ochan.ctmp,tmp1,1)='1' Then 'RAW MODE 'zchannel' -o 'nnick;End;Else Do
  16. If c_wordmode=1 Then Call KICK(unick,zchannel,swearword);Else Call KICK_BAN(unick,zchannel,swearword);End;Return;ROUTINE1:;atype=1;etype=10;emess=Substr(line.rest,3);ROUTINE2:;If mnick=unick Then Return;If type=2 Then Do;atype=2;etype=Substr(line.rest,3,1);emess=Substr(line.rest,4);End;If etable.etype="" Then Return;mess="";emess=Reverse(Translate(emess,atable.atype,etable.etype));Do While emess~="";Parse Value emess With wrd1 wrd2 emess;mess=mess wrd1 Reverse(wrd2);End;mess=Strip(mess,'L');If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess;Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;If c_speak=1 & Left(mess,1)='@' Then Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick line.rest;Return;ROUTINE3:;If mnick=unick Then Return;emess=Reverse(Substr(line.rest,4));etype=Substr(line.rest,3,1);If etype='+' Then ekey=Upper(line.dest);Else ekey=c_mykey;km=1;kp.1=72;Do While ekey~="";ch=c2d(Substr(ekey,1,1));ekey=Delstr(ekey,1,1)
  17. If ch>112 Then ch=ch-150;If ch<32 Then ch=ch+70;kp.km=ch;km=km+1;End;kn=1;mess="";Do While emess~="";etmp=c2d(Left(emess,1))-kp.kn;If etmp<0 Then etmp=256+etmp;mess=mess||d2c(etmp);emess=Delstr(emess,1,1);kn=kn+1;If kn>=km Then kn=1;End;mess=Reverse(mess);If Word(mess,1)='DFx' Then Do;mess=Subword(mess,2);If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess;Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;End;If c_speak=1 & Left(mess,1)='@' Then Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick line.rest;Return;ROUTINE4:;If Word(line.rest,1)~=':[UTC234]:' | mnick=unick Then Return;Parse Value line.rest With ':[UTC234]:' emess;mess="";emess=Substr(Strip(emess),2);emess=Delstr(emess,Length(emess),1);ln=Length(emess);Do loop=1 To ln;ch=c2d(substr(emess,loop,1));If ch>128 Then ch=ch-128;mess=mess||d2c(ch);End;mess=Strip(mess,'L');If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess
  18. Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;If c_speak=1 & Left(mess,1)='@' Then Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick line.rest;Return;ROUTINE5:;If com~=3 Then Return;Parse Value line.rest With comc misc;comc=Upper(Substr(comc,3));misc=Strip(Delstr(misc,Length(misc)));If misc="" Then comc=Left(comc,Length(comc)-1);tmp2=Find(c_ctcpcom,comc);If tmp2~=0 & c_ctcpnum.tmp2>0 Then Do;If c_select=1 Then tmp3=Random(1,c_ctcpnum.tmp2);Else tmp3=c_ctcpnxt.tmp2;c_ctcpnxt.tmp2=c_ctcpnxt.tmp2+1;If c_ctcpnxt.tmp2>c_ctcpnum.tmp2 Then c_ctcpnxt.tmp2=1;mess=comc' 'dwarfx' 'MPARSE(Strip(c_ctcp.tmp2.tmp3,'B'));tmp2=Pos(ecode,mess);tmp3=Length(mess)-1;Do While tmp2~=0 & tmp2~=tmp3;mess=Insert(comc' 'dwarfx' ',mess,tmp2+1);tmp2=Pos(ecode,mess,tmp2+2);End;Call MSEND(nnick,4,mess);End;Else Do;tmp2=Find(mainctcp,comc);If tmp2>5 Then Do;routine='CTCPMSG'||tmp2;Interpret 'Call' routine;End
  19. Else If tmp2=0 Then Call SEND(nnick,4,'ERRMSG 'comc' 'dwarfx' :Unknown Query!');End;Return;ROUTINE6:;If unick~=mnick Then Return;Call Setclip('DFxTIME',Time());Parse Value line.rest With ':%'mycom opts;com=Find(mycoms,Upper(mycom));routine='MASTER'||com;If com>0 Then Interpret 'Call' routine;Return;ROUTINE7:;If Upper(Word(Substr(line.rest,3),1))~=mnick Then Return;If c_autosend=1 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFSoUNd.AmIRX 'envadr' 'unick' 'c_drawer' 'Word(line.rest,2);Else Call SEND(nnick,4,'ERRMSG GETSOUND 'dwarfx' :'znick' has autosend turned off.');Return;ROUTINE8:;If c_speak~=1 Then Return;mess=Substr(line.rest,3);DECODE_SPEAK:;If Left(mess,1)='@' Then Do;mess=Substr(mess,2);If Upper(Word(mess,1))=mnick Then mess=SubWord(mess,2);Else mess="";End;If mess~="" Then Address Command 'Run >NIL: 'sayname nnick': 'mess;Return;COMMAND5:;zchannel=Substr(zchannel,2);uchannel=Upper(zchannel);clist=Find(uchans,uchannel);If clist=0 & mnick=unick Then Do
  20. chanmax=chanmax+1;nchans=nchans' 'zchannel;uchans=uchans' 'uchannel;fchan.chanmax=0;lchan.chanmax=mnick;ochan.chanmax='0';wchan.chanmax='0';gchan.chanmax=SCAN_GREET(uchannel);If Word(coms,Words(coms))~='353' Then coms=coms' 353';End;Else Do;lchan.clist=lchan.clist' 'unick;wchan.clist=wchan.clist||'0';ochan.clist=ochan.clist||'0';End;If c_wordkick>0 Then Call CHECK_NICK();Else nkick=0;If nkick=0 & unick~=mnick Then Do;Call AUTO_FRIEND();If gchan.clist~=0 Then Call CHAN_GREET(nnick,Word(nchans,clist),gchan.clist);End;Return;COMMAND6:;ynick=Substr(line.dest,2);xnick=Upper(ynick);Do clist=1 To chanmax;tmp=Find(lchan.clist,unick);If tmp~=0 Then Do;lchan.clist=Insert(xnick' ',Delword(lchan.clist,tmp,1),Wordindex(lchan.clist,tmp)-1);End;End;If mnick=unick Then Do;mnick=xnick;znick=ynick;End;unick=xnick;nnick=ynick;If c_wordkick>0 Then Call CHECK_NICK();Return;COMMAND7:;Do clist=1 To chanmax;tmp=Find(lchan.clist,unick);If tmp~=0 Then Do;If mnick=unick Then Call REMOVE;Else Do
  21. lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);End;End;End;Return;COMMAND8:;clist=Find(uchans,Upper(zchannel));tmp=Find(lchan.clist,unick);If tmp=0 Then Return;If mnick=unick Then Call KILL_CHANNEL(clist);Else Do;lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);End;Return;COMMAND9:;clist=Find(uchans,Upper(zchannel));knick=Upper(Word(line.dest' 'line.rest,2));tmp=Find(lchan.clist,knick);If tmp=0 Then Return;If mnick=knick Then Call KILL_CHANNEL(clist);Else Do;lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);End;Return;COMMAND10:;Parse Upper Value line.rest With opts tmps;clist=Find(uchans,Upper(zchannel));opts=Strip(opts);If clist=0 Then Return;Do While tmps~="";Parse Value tmps With tmp1 tmps;opt1=Left(opts,2);opts=Delstr(opts,1,2);tmp2=Find(lchan.clist,Strip(tmp1))
  22. If opt1="+O" Then ochan.clist=Overlay('1',ochan.clist,tmp2);If opt1="-O" Then ochan.clist=Overlay('0',ochan.clist,tmp2);End;Return;COMMAND11:;If c_join=1 & chanmax<c_maxjoin Then 'Say /Join 'Word(Substr(line.rest,2),1);Return;COMMAND12:;Do loop=1 To Words(uchans);Drop lchan.loop;Drop ochan.loop;Drop fchan.loop;Drop wchan.loop;End;uchans="";nchans="";chanmax=0;'GetMyNick';znick=result;mnick=Upper(znick);Return;COMMAND13:;tmp=Upper(line.dest' 'line.rest);Parse Value tmp With junk '=' tmpchan ':'tmp;clist=Find(uchans,tmpchan);If clist~=0 & fchan.clist=0 Then Do;Do While tmp~="";Parse Value tmp With tmpnick tmp;fchar=Substr(tmpnick,1,1);If fchar='@' | fchar='+' Then tmpnick=Substr(tmpnick,2);ctmp=Find(lchan.clist,tmpnick);If ctmp=0 Then Do;lchan.clist=lchan.clist' 'tmpnick;wchan.clist=wchan.clist||'0';If fchar='@' Then ochan.clist=ochan.clist||'1';Else ochan.clist=ochan.clist||'0';End;Else Do;If fchar='@' Then ochan.clist=Overlay('1',ochan.clist,ctmp);Else ochan.clist=Overlay('0',ochan.clist,ctmp);End;End
  23. fchan.clist=1;tot=0;Do loop=1 To chanmax;If fchan.loop Then tot=tot+1;End;If tot>=chanmax Then coms=Delword(coms,Words(coms));End;Return;MASTER1:;Call REMOVE();Return;MASTER2:;opts=Strip(opts);tmp=Value(opts);If Upper(opts)~=Upper(tmp) Then 'Echo 'dfxname'DEBUG: 'opts' - 'tmp;Else 'Echo 'dfxname'DEBUG: 'opts' - No Such Variable!';Return;MASTER3:;Call CONFIG_SETUP();If Upper(Strip(opts))~="QUIET" Then 'Echo 'dfxname' 'dwarfx' Config Reloaded!';Return;CTCPMSG6:;Call SEND(unick,4,'VERSION 'dwarfx znick' is running 'dfxver);Return;CTCPMSG7:;Call SEND(unick,4,'SOURCE 'dwarfx' You can get the latest version of 'dwarfx' for AmIRC from 'dfxweb' ('dwarfx' Web Site)');Return;CTCPMSG8:;Call SEND(unick,4,'CLIENINFO 'dwarfx' 'bold2||ourctcp||bold2);Return;CTCPMSG9:;If c_autodcc=0 & c_soundmode~=3 Then Return;Parse Value misc With tmp tmp1 junkip junkport tmp2 .;If tmp~="SEND" & tmp~="MOVE" Then Return;autos=GetClip('DFxAS.'envnum);tmp3=Find(autos,Upper(tmp1))
  24. If c_soundmode=3 & tmp3~=0 Then Setclip('DFxAS.'envnum,Strip(Delword(autos,tmp3,1)));Else If c_autodcc=0 Then Return;If TEST_DCC()>=c_dccspeed Then Return;If tmp3=0 Then Do;tmp=c_dccdrawer||tmp1;tmp2=c_dccmax-tmp2;End;Else Do;tmp=c_drawer||tmp1;tmp2=c_soundmax-tmp2;End;tmp3="";Do While Exists(tmp||tmp3);If tmp3="" Then Do;tmp3=1;tmp=tmp'.';End;Else tmp3=tmp3+1;End;If Sign(tmp2)~=-1 Then 'Say /DCC GET 'nnick' 'tmp1' 'tmp||tmp3;Return;TEST_DCC:;w=Showlist('W')' 'Showlist('T');p=Pos('AmIRC DCC R',w);n=0;Do While p~=0;n=n+1;p=Pos('AmIRC DCC R',w,p+21);End;Return n;CTCPMSG10:;fname=c_drawer||word(misc,1);If Exists(fname) Then Do;If c_sounds=1 Then Address Command 'Run >NIL: 'c_player' 'fname;End;Else Do;Select;When c_soundmode=1 Then Call SEND(unick,4,'ERRMSG SOUND 'dwarfx' :'misc' doesn'quote't exist!');When c_soundmode=2 Then 'Echo 'dfxname||bold2||nnick||bold2' requested sound 'bold2||misc||bold2' which doesn'quote't exist!';When c_soundmode=3 Then Do
  25. Call SEND(unick,2,'GETSOUND 'misc);Setclip('DFxAS.'envnum,Getclip('DFxAS.'envnum)' 'Upper(misc));End;Otherwise;End;End;Return;CTCPMSG11:;If c_autosend=1 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFSoUNd.AmIRX 'envadr' 'unick' 'c_drawer' 'Word(misc,1);Else Call SEND(nnick,4,'ERRMSG GETSOUND 'dwarfx' :'znick' has autosend turned off.');Return;CTCPMSG12:;Call SEND(unick,4,'ERRMSG 'dwarfx' 'misc' :Message Returned.');Return;CHECK_NICK:;nloop=1;nkick=0;tmp=Words(c_words);Do wloop=1 To tmp;xwrd=Word(c_words,wloop);nkick=Pos(xwrd,unick);If nkick>0 Then Leave;End;If nkick>0 Then Do;If c_wordmode=1 Then Call KICK(unick,"",swearnick);Else Call KICK_BAN(unick,"",swearnick);End;Return;AUTO_FRIEND:;'Userhost 'nnick;ohost=result;nhost=unick'!'Upper(ohost)'.';Do loop=1 To Words(c_opsaddr);tmp2=Translate(Word(c_opsaddr,loop),' ','*')'.';tmp3=1;Do loop1=1 To Words(tmp2);tmp3=Pos(Word(tmp2,loop1),nhost,tmp3);If tmp3=0 Then Leave;End;If tmp3~=0 Then Leave;End;If tmp3=0 Then Return;nfound=loop
  26. tmp1=Word(c_ops.nfound,2);note="";If c_autoop>0 & Left(tmp1,1)='O' Then Do;If OP(nnick,zchannel)=1 Then note="Op'ed";End;If Right(tmp1,1)='M' Then Do;Call GREET(nnick,zchannel);If tmp2>0 Then If note~="" Then note=note" And Greeted";Else note="Greeted";End;If note~="" Then note="("ohost") Has been "note"!";Else note="("ohost") Has arrived!";"Echo P="bold1"«DFx_Friend» "bold2||nnick||bold2" "note;Return;GREET:;Parse Arg knick,kchan;kopt=Word(c_ops.nfound,3);kmess=MPARSE(Subword(c_ops.nfound,4));If Left(kopt,1)='C' Then tmp1=kchan;Else tmp1=knick;tmp2=Pos(Right(kopt,1),'MAN');If tmp2>0 Then Call MSEND(tmp1,tmp2,kmess);Return;CHAN_GREET:;Parse Arg cgnick,cgchan,cgreet;kopt=Word(c_greets.cgreet,1);kmess=MPARSE(Subword(c_greets.cgreet,2));If Left(kopt,1)='C' Then tmp1=cgchan;Else tmp1=cgnick;tmp2=Pos(Right(kopt,1),'MAN');If tmp2>0 Then Do;Call MSEND(tmp1,tmp2,kmess);"Echo P="bold1"«DFx_Greet» "bold2||nnick||bold2" Has been greeted!";End;Return;MPARSE:;Parse Arg mmess;tmp=Pos('/',mmess);Do While tmp>0
  27. tmp2=Upper(Substr(mmess,tmp+1,1));Select;When tmp2="/" Then mnew="/";When tmp2="P" Then mnew=nnick;When tmp2="T" Then mnew=Date('W')' 'Date()' 'Time();When tmp2="N" Then mnew=znick;When tmp2="D" Then Call CALC_IDLE();Otherwise mnew="";End;mmess=Insert(mnew,Delstr(mmess,tmp,2),tmp-1);tmp=Pos('/',mmess,tmp+length(mnew));End;If Right(mmess,2)~=ecode Then mmess=mmess||ecode;Return mmess;CALC_IDLE:;mnew=Getclip('DFxTIME');If mnew~="" Then Do;Parse Value Time() With newh':'newm':'news;Parse Value mnew With oldh':'oldm':'olds;If news<olds Then Do;news=news+60;newm=newm-1;End;If newm<oldm Then Do;newm=newm+60;newh=newh-1;End;If newh<oldh Then newh=newh+24;newh=newh-oldh;newm=newm-oldm;news=news-olds;mnew="";If newh>0 Then If newh=1 Then mnew="1 Hour ";Else mnew=newh" Hours ";If newm>0 | newh>0 Then If newm=1 Then mnew=mnew||"1 Minute ";Else mnew=mnew||newm" Minutes ";If news>0 | newm>0 | newh>0 Then If news=1 Then mnew=mnew||"1 Second";Else mnew=mnew||news" Seconds";mnew="DWaRFx Idle "mnew;End
  28. Else mnew="<DWaRFx Idle time not available>";Return;MSEND:;Parse Arg sdest,stype,smess;stmp1=Pos(scanc,smess);Do While stmp1~=0;stmp2=Substr(smess,stmp1+1,1);Select;When stmp2=0 Then Do;stmp3=Left(smess,stmp1-1);smess=Substr(smess,stmp1+2);Select;When stype=1 Then 'RAW PRIVMSG 'sdest' :'stmp3;When stype=2 Then 'RAW PRIVMSG 'sdest' :'ctcp||stmp3||ctcp;When stype=3 Then 'RAW NOTICE 'sdest' :'stmp3;When stype=4 Then 'RAW NOTICE 'sdest' :'ctcp||stmp3||ctcp;End;End;When stmp2=1 Then Do;stmp3=Pos(')',smess,stmp1);If stmp3~=0 Then Do;stmp4=Pos('(',smess,stmp1);sname=Substr(smess,stmp4+1,stmp3-stmp4-1);If sname~="" Then 'RAW PRIVMSG 'sdest' :'ctcp||'SOUND 'sname' ('sname')'ctcp;End;Else stmp3=stmp1+2;smess=Delstr(smess,stmp1,stmp3-stmp1+1);End;When stmp2=2 Then Do;stmp3=Word(nchans,Find(uchans,Upper(zchannel)));smess=Insert(stmp3,Delstr(smess,stmp1,2),stmp1-1);End;Otherwise;smess=Delstr(smess,stmp1,1);End;stmp1=Pos(scanc,smess);End;Return;SEND:;Parse Arg sdest,stype,smess;Select
  29. When stype=1 Then 'RAW PRIVMSG 'sdest' :'smess;When stype=2 Then 'RAW PRIVMSG 'sdest' :'ctcp||smess||ctcp;When stype=3 Then 'RAW NOTICE 'sdest' :'smess;When stype=4 Then 'RAW NOTICE 'sdest' :'ctcp||smess||ctcp;End;Return;OP:;Parse Arg knick,kchan;kchan=Upper(kchan);tmp=Find(c_opchan,kchan);If c_autoop~=1 Then If (tmp=0 & c_autoop=2) | (tmp~=0 & c_autoop=3) Then Return 0;clist=Find(uchans,kchan);If Left(ochan.clist,1)='0' Then Return 0;'RAW MODE 'kchan' +o :'knick;Return 1;KICK:;Parse Arg knick,kchan,kreason;If kchan="" Then Do;Do loop=1 To chanmax;If Find(lchan.loop,knick)~=0 & Left(ochan.loop,1)='1' Then Do;ktmp=Word(uchans,loop);kchan=Find(c_wordchan,ktmp);If (kchan~=0 & c_wordkick=2) | (kchan=0 & c_wordkick=3) | c_wordkick=1 Then 'RAW KICK 'ktmp' 'knick' :'kreason;End;End;End;Else Do;loop=Find(uchans,Upper(kchan));If loop~=0 & Left(ochan.loop,1)='1' Then 'RAW KICK 'kchan' 'knick' :'kreason;End;Return;KICK_BAN:;Parse Arg knick,kchan,kreason;khost=GET_HOST(knick);If kchan="" Then Do;kchan=Upper(kchan)
  30. Do loop=1 To chanmax;If Find(lchan.loop,knick)~=0 & Left(ochan.loop,1)='1' Then Do;ktmp=Word(uchans,loop);kchan=Find(c_wordchan,ktmp);If (kchan~=0 & c_wordkick=2) | (kchan=0 & c_wordkick=3) Then Do;'RAW MODE 'ktmp' +b 'khost;'RAW KICK 'ktmp' 'knick' :'kreason;End;End;End;End;Else Do;loop=Find(uchans,Upper(kchan));If loop~=0 & Left(ochan.loop,1)='1' Then Do;'RAW MODE 'kchan' +b 'khost;'RAW KICK 'kchan' 'knick' :'kreason;End;End;Return;GET_HOST:;Parse Arg ghnick;'Userhost 'ghnick;Parse Value result With ghname'@'ghhost;If DataType(Compress(ghhost,'.'))='NUM' Then Return '*!'ghname'@'ghhost;Return '*!'ghname'@'||Space(Translate(ghhost,hostout,hostin),1,'*');SCAN_GREET:;Parse Arg cgchan;cgreet=0;Do gloop=1 To Words(c_gchans);tmp2=Translate(Word(c_gchans,gloop),' ','*');tmp3=1;Do gloop1=1 To Words(tmp2);tmp3=Pos(Word(tmp2,gloop1),cgchan,tmp3);If tmp3=0 Then Leave;End;If tmp3~=0 Then Leave;End;If tmp3=0 Then Return 0;Return gloop;KILL_CHANNEL:;Parse Arg kchan
  31. uchans=Strip(Delword(uchans,kchan,1));nchans=Strip(Delword(nchans,kchan,1));If kchan=chanmax Then chanmax=chanmax-1;Else Do;chanmax=chanmax-1;Do loop=kchan to chanmax;tmp=loop+1;lchan.loop=lchan.tmp;ochan.loop=ochan.tmp;fchan.loop=fchan.tmp;wchan.loop=wchan.tmp;gchan.loop=gchan.tmp;End;End;Return;SYNTAX:;If Show('P',envadr)=1 Then Do;'Echo 'dfxname||dwarfx' ARexx Error 'rc' detected on Source Line 'sigl'!';'Echo 'dfxname||dwarfx' Will attempt to continue, but you may have to quit and reload 'dwarfx' if it isn'quote't working properly!';End;Else Call REMOVE;Return;REMOVE:;If Show('P',envadr)=1 Then 'Echo 'dfxname||dwarfx' has Quit!';Call CLEAR_DFX;Exit;Return;CLEAR_DFX:;Do loop=0 To 10;Call Setclip('ELINE.'loop);End;Call Setclip('ALINE.1');Call Setclip('ALINE.2');Call Setclip('DFx.'envnum);If Exists('Ram:DFx-Say') Then Address Command 'Delete >NIL: Ram:DFx-Say';Return;ERR:;Parse Arg errno;temp=dfxname||bold2'Error: 'bold2;Select;When errno=1 Then 'Echo 'temp' 'dwarfx' is already running on AmIRC.'envnum'!'
  32. When errno=2 Then 'Echo 'temp'Can'd2c(39)'t find file 'confname'!';End;Call CLEAR_DFX;Exit;Return;SETUP:;Parse Source . . drawer .;tmp=Pos('/',drawer);If tmp=0 Then tmp=Pos(':',drawer);Else tmp=Lastpos('/',drawer);drawer=Left(drawer,tmp);bold1=d2c(27)"x";bold2=d2c(2);host="AMIRC.";hostlen=Length(host);dwarfx=bold2'DWaRFx'bold2;dfxname='P='bold1'«DWaRFx» ';confname=drawer||"DWaRFCoNFiG.DaT";scan='A9'x||'AE'x||'A4'x||'['||'01'x||'%!@';coms='332 TOPIC PRIVMSG NOTICE JOIN NICK QUIT PART KICK MODE INVITE 001';mycoms='QUIT DEBUG RELOAD';ctcp='01'x;inverse='i';underline='_';scanc='80'x;ccode=scanc'2';scode=scanc'1';ecode=scanc'0';mainctcp='USERINFO TIME ECHO PING ACTION VERSION SOURCE CLIENTNFO DCC';ourctcp='SOUND GETSOUND ERRMSG';mainctcp=mainctcp' 'ourctcp;swearword=dwarfx' - Swear word kick!';swearnick=dwarfx' - Obscene nick kick!';dfxweb='http://www.users.globalnet.co.uk/~gazy/';dfxver=bold2'DWaRFx'bold2' V2.3 - By Gareth Murfin & David Newton'
  33. tmp=Random(,,Time(S));hostin="1234567890";hostout="          ";quote="'";Return;FIND_PORT:;ports=Show('P');envadr="";tmp=Pos(host,ports);If tmp>0 Then ports=Substr(ports,tmp);Else ports="";Do While envadr="" & ports~="";Parse Value ports With tmp ports;If Left(tmp,hostlen)=host Then Do;If Getclip('DFx.'Substr(tmp,hostlen+1))="" Then envadr=tmp;End;End;Return;NICKLIST:;'Channels';tmp=result;If tmp~="" Then Do;'Echo 'dfxname' 'dwarfx' Will send and receive some IRC Server Commands, Please Ignore them!';chanmax=Words(tmp);uchans="";nchans="";If Word(coms,Words(coms))~='353' Then coms=coms' 353';Do loop=1 To chanmax;Parse Value tmp With tmpchan tmp;'RAW NAMES :'tmpchan;nchans=nchans' 'tmpchan;uchans=uchans' 'Upper(tmpchan);lchan.loop=mnick;ochan.loop='0';fchan.loop=0;wchan.loop='0';gchan.loop=SCAN_GREET(tmpchan);End;End;Else Do;chanmax=0;uchans="";nchans="";End;Return;CONFIG_SETUP:;Call GET_CONFIG();Call GET_DATA();If c_speak~=0 Then Do;If c_say="" Then sayname='c:say';Else sayname=c_say
  34. If Exists(sayname) Then Do;tmp=sayname;sayname='Ram:DFx-say';Address Command 'Copy >nil: 'tmp sayname;End;Else sayname='say';End;Return;GET_DATA:;atable.1='? ZYXWVUTSRQPONMLKJIHGFEDCBA-0987654321}{][)($#@!,:.';Call SetClip("ALINE.1",atable.1);etable.10=X2C(E7CFEEC2F3CEC1C7C0C3DBEACAFEDDF5E1E5FDFCE0FDB6CCE4F1EFF2);etable.10=etable.10||X2C(B6A4AFA5B0AEBFBAAAF7ACECDEA6C8A7D0E6DFF0B7B1F8B5);Call SetClip("ELINE.10",etable.10);tmp=1;If ~Open('file1',drawer||'MCF.Encrypt') Then Do;If ~Open('file1','AmIRC:Rexx/DWaRFx/MCF.Encrypt') Then Do;If ~Open('file1','MCF:MCF.Encrypt') Then Do;'Echo 'dfxname' 'd2c(2)'MCF.Encrypt'd2c(2)' not found! (See DWaRFx Docs!)';'Echo 'dfxname'If you do not install this file, 'd2c(2)'DWaRFx'd2c(2)' will be unable to Encode/Decode MCF encrypted messages!';Do loop=0 To 9;etable.loop="";End;atable.2="";tmp=0;End;End;End;If tmp=0 Then Return;ln=Readln('file1');atable.2=Readln('file1');Call Setclip("ALINE.2",atable.2);Do loop=0 To 9
  35. etable.loop=Readln('file1');Setclip("ELINE."loop,etable.loop);End;Call Close('file1');Return;GET_CONFIG:;c_select=1;c_join=0;c_maxjoin=4;c_autoop=0;c_wordkick=0;c_wordmode=1;c_wordwarn=3;c_deop=0;c_soundmode=0;c_speak=0;c_autosend=0;c_sounds=0;c_dccmax=0;c_autodcc=0;c_dccspeed=6;c_opsaddr="";c_gchans="";c_ops.1="";c_greets.1="";c_ctcpcom="";c_ctcpnum.1=0;c_ctcp.1.1="";c_ctcpnxt.1=1;c_mykey="";c_drawer="";c_player="";c_wordchan="";c_opchan="";c_words="";c_say="";c_dccdrawer="";If ~Open('File1',confname,'R') Then Call ERR(2);opttmp="";Do While ~Eof('File1');ln=Readln('File1');If Left(ln,1)="!" Then Do;opttmp=Word(ln,1);ln=Readln('File1');loop=1;End;Select;When opttmp="!OPTIONS:" Then Call CONFIG_OPTIONS;When opttmp="!FRIENDS:" Then Call CONFIG_PARSE(1);When opttmp="!OP-CHANNELS:" Then Call CONFIG_PARSE(2);When opttmp="!GREETS:" Then Call CONFIG_PARSE(3);When opttmp="!WORDS:" Then Call CONFIG_PARSE(4);When opttmp="!WORD-CHANNELS:" Then Call CONFIG_PARSE(5);When opttmp="!CTCP:" Then Call CTCP_PARSE;Otherwise;End
  36. End;Call Close('File1');Return;CONFIG_OPTIONS:;If Left(ln,1)="$" Then Do;Parse Value ln With '$'ln'='tmp junk;ln=Upper(ln);junk=tmp;tmp=Upper(tmp);Select;When ln='SPEECH' Then Do;Select;When tmp='@' Then c_speak=1;When tmp='A' Then c_speak=2;Otherwise c_speak=0;End;End;When ln='SELECT' Then Do;If tmp='R' Then c_select=1;Else c_select=2;End;When ln='WORDMODE' Then Do;If tmp='B' Then c_wordmode=2;Else c_wordmode=1;End;When ln='KEY' Then c_mykey=junk;When ln='SOUNDS' Then c_sounds=YESNO();When ln='SPEECHPATH' Then c_say=junk;When ln='DCCMAX' Then c_dccmax=junk;When ln='DCCSPEED' Then c_dccspeed=junk;When ln='DCCDRAWER' Then Do;c_dccdrawer=junk;If Right(c_dccdrawer,1)~=':' & Right(c_dccdrawer,1)~='/' Then c_dccdrawer=c_dccdrawer'/';End;When ln='SOUNDMODE' Then Do;Select;When tmp='S' Then c_soundmode=1;When tmp='Y' Then c_soundmode=2;When tmp='G' Then c_soundmode=3;Otherwise c_soundmode=0;End;End;When ln='MAXJOIN' Then c_maxjoin=junk;When ln='SOUNDPLAYER' Then c_player=junk;When ln='SOUNDMAX' Then c_soundmax=junk
  37. When ln='SOUNDDRAWER' Then Do;c_drawer=junk;If Right(c_drawer,1)~=':' & Right(c_drawer,1)~='/' Then c_drawer=c_drawer'/';End;When ln='AUTOOP' Then Call CONFIG_OPT(1);When ln='WORDKICK' Then Call CONFIG_OPT(2);When ln='AUTOSEND' Then c_autosend=YESNO();When ln='AUTOJOIN' Then c_join=YESNO();When ln='AUTODCC' Then c_autodcc=YESNO();When ln='WARNDEOP' Then c_deop=YESNO();When ln='WORDWARN' Then Do;If junk<0 Then junk=0;If junk>9 Then junk=9;c_wordwarn=junk;End;Otherwise;End;End;Return;YESNO:;Select;When tmp='Y' Then num=1;Otherwise num=0;End;Return num;CONFIG_OPT:;Parse Arg pick;Select;When tmp='N' Then num=0;When tmp='A' Then num=1;When tmp='S' Then num=2;When tmp='E' Then num=3;Otherwise;End;Select;When pick=1 Then c_autoop=num;When pick=2 Then c_wordkick=num;Otherwise;End;Return;CONFIG_PARSE:;Parse Arg tmp;If ln~="" Then Do;Select;When tmp=1 Then Do;c_opsaddr=c_opsaddr' 'Upper(Word(ln,1));c_ops.loop=Upper(Subword(ln,2,3))' 'PREPARSE(Subword(ln,5));End;When tmp=2 Then c_opchan=c_opchan' 'Upper(ln)
  38. When tmp=3 Then Do;c_gchans=c_gchans' 'Upper(Word(ln,1));c_greets.loop=Upper(Word(ln,2))' 'PREPARSE(Subword(ln,3));End;When tmp=4 Then c_words=c_words' 'Upper(ln);When tmp=5 Then c_wordchan=c_wordchan' 'Upper(ln);Otherwise;End;loop=loop+1;Select;When tmp=1 Then c_ops.loop="";When tmp=3 Then c_greets.loop="";Otherwise;End;End;Return;CTCP_PARSE:;If ln~="" Then Do;If Left(ln,1)="&" Then Do;If loop=1 Then c_ctcpcom="";c_ctcpcom=c_ctcpcom||Upper(Strip(Substr(ln,2),'B'))' ';loop2=1;c_ctcp.loop.loop2="";c_ctcpnum.loop=0;c_ctcpnxt.loop=1;loop=loop+1;End;Else Do;tmp=loop-1;tmp2=Upper(ln);If word(c_ctcpcom,tmp)="CLIENTINFO" Then Do;If Find(tmp2,'ERRMSG')=0 Then ln='ERRMSG 'ln;If Find(tmp2,'GETSOUND')=0 Then ln='GETSOUND 'ln;If Find(tmp2,'SOUND')=0 Then ln='SOUND 'ln;End;c_ctcp.tmp.loop2=PREPARSE(ln);c_ctcpnum.tmp=c_ctcpnum.tmp+1;loop2=loop2+1;End;End;Return;PREPARSE:;Parse Arg mmess;tmp3=Pos('/',mmess);Do While tmp3>0;tmp2=Upper(Substr(mmess,tmp3+1,1));Select;When tmp2="B" Then mnew=bold2
  39. When tmp2="I" Then mnew=inverse;When tmp2="U" Then mnew=underline;When tmp2="V" Then mnew=dfxver;When tmp2="W" Then mnew=dfxweb;When tmp2="L" Then mnew=dwarfx;When tmp2="E" Then mnew=ecode;When tmp2="S" Then mnew=scode;When tmp2="C" Then mnew=ccode;Otherwise mnew="/"tmp2;End;mmess=Insert(mnew,Delstr(mmess,tmp3,2),tmp3-1);If mnew=scode Then tmp3=Pos(')',mmess,tmp3);Else tmp3=tmp3+Length(mnew);tmp3=Pos('/',mmess,tmp3);End;If Right(mmess,2)~=ecode Then mmess=mmess||ecode;Return mmess
  40. /* Original script: 1008 lines, 29319 bytes */
  41.